{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Modeling and Simulation in Python\n",
    "\n",
    "Chapter 22\n",
    "\n",
    "Copyright 2017 Allen Downey\n",
    "\n",
    "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Configure Jupyter so figures appear in the notebook\n",
    "%matplotlib inline\n",
    "\n",
    "# Configure Jupyter to display the assigned value after an assignment\n",
    "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n",
    "\n",
    "# import functions from the modsim.py module\n",
    "from modsim import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A `Vector` object represents a vector quantity.  In the context of mechanics, vector quantities include position, velocity, acceleration, and force, all of which might be in 2D or 3D.\n",
    "\n",
    "You can define a `Vector` object without units, but if it represents a physical quantity, you will often want to attach units to it.\n",
    "\n",
    "I'll start by grabbing the units we'll need."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "kilogram"
      ],
      "text/latex": [
       "$\\mathrm{kilogram}$"
      ],
      "text/plain": [
       "<Unit('kilogram')>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = UNITS.meter\n",
    "s = UNITS.second\n",
    "kg = UNITS.kilogram"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a two dimensional `Vector` in meters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}3.0 & 4.0\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}3.0 & 4.0\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([3., 4.]) <Unit('meter')>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = Vector(3, 4) * m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can access the elements by name."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "3.0 meter"
      ],
      "text/latex": [
       "$3.0\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "3.0 <Unit('meter')>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "4.0 meter"
      ],
      "text/latex": [
       "$4.0\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "4.0 <Unit('meter')>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The magnitude is the length of the vector."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "5.0 meter"
      ],
      "text/latex": [
       "$5.0\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "5.0 <Unit('meter')>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.mag"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The angle is the number of radians between the vector and the positive x axis."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "0.9272952180016122 radian"
      ],
      "text/latex": [
       "$0.9272952180016122\\ \\mathrm{radian}$"
      ],
      "text/plain": [
       "0.9272952180016122 <Unit('radian')>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.angle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we make another `Vector` with the same units,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}1.0 & 2.0\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}1.0 & 2.0\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([1., 2.]) <Unit('meter')>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B = Vector(1, 2) * m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can add `Vector` objects like this"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}4.0 & 6.0\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}4.0 & 6.0\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([4., 6.]) <Unit('meter')>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A + B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And subtract like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}2.0 & 2.0\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}2.0 & 2.0\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([2., 2.]) <Unit('meter')>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A - B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can compute the Euclidean distance between two Vectors."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "2.8284271247461903 meter"
      ],
      "text/latex": [
       "$2.8284271247461903\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "2.8284271247461903 <Unit('meter')>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.dist(B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the difference in angle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "-0.17985349979247822 radian"
      ],
      "text/latex": [
       "$-0.17985349979247822\\ \\mathrm{radian}$"
      ],
      "text/plain": [
       "-0.17985349979247822 <Unit('radian')>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.diff_angle(B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we are given the magnitude and angle of a vector, what we have is the representation of the vector in polar coordinates."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "0.9272952180016122 radian"
      ],
      "text/latex": [
       "$0.9272952180016122\\ \\mathrm{radian}$"
      ],
      "text/plain": [
       "0.9272952180016122 <Unit('radian')>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mag = A.mag\n",
    "angle = A.angle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `pol2cart` to convert from polar to Cartesian coordinates, and then use the Cartesian coordinates to make a `Vector` object.\n",
    "\n",
    "In this example, the `Vector` we get should have the same components as `A`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}3.0000000000000004 & 3.9999999999999996\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}3.0000000000000004 & 3.9999999999999996\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([3., 4.]) <Unit('meter')>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x, y = pol2cart(angle, mag)\n",
    "Vector(x, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Another way to represent the direction of `A` is a unit vector, which is a vector with magnitude 1 that points in the same direction as `A`.  You can compute a unit vector by dividing a vector by its magnitude:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}0.6 & 0.8\\end{pmatrix} dimensionless\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}0.6 & 0.8\\end{pmatrix}\\ dimensionless$"
      ],
      "text/plain": [
       "array([0.6, 0.8]) <Unit('dimensionless')>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A / A.mag"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Or by using the `hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}0.6 & 0.8\\end{pmatrix} dimensionless\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}0.6 & 0.8\\end{pmatrix}\\ dimensionless$"
      ],
      "text/plain": [
       "array([0.6, 0.8]) <Unit('dimensionless')>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.hat()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:** Create a `Vector` named `a_grav` that represents acceleration due to gravity, with x component 0 and y component $-9.8$ meters / second$^2$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}0.0 & -9.8\\end{pmatrix} meter/second<sup>2</sup>\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}0.0 & -9.8\\end{pmatrix}\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$"
      ],
      "text/plain": [
       "array([ 0. , -9.8]) <Unit('meter / second ** 2')>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "a_grav = Vector(0, -9.8) * m / s**2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Degrees and radians\n",
    "\n",
    "Pint provides units to represent degree and radians."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "radian"
      ],
      "text/latex": [
       "$\\mathrm{radian}$"
      ],
      "text/plain": [
       "<Unit('radian')>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "degree = UNITS.degree\n",
    "radian = UNITS.radian"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you have an angle in degrees,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "45 degree"
      ],
      "text/latex": [
       "$45\\ \\mathrm{degree}$"
      ],
      "text/plain": [
       "45 <Unit('degree')>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "angle = 45 * degree\n",
    "angle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can convert to radians."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "0.7853981633974483 radian"
      ],
      "text/latex": [
       "$0.7853981633974483\\ \\mathrm{radian}$"
      ],
      "text/plain": [
       "0.7853981633974483 <Unit('radian')>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "angle_rad = angle.to(radian)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If it's already in radians, `to` does the right thing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "0.7853981633974483 radian"
      ],
      "text/latex": [
       "$0.7853981633974483\\ \\mathrm{radian}$"
      ],
      "text/plain": [
       "0.7853981633974483 <Unit('radian')>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "angle_rad.to(radian)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can also convert from radians to degrees."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "45.0 degree"
      ],
      "text/latex": [
       "$45.0\\ \\mathrm{degree}$"
      ],
      "text/plain": [
       "45.0 <Unit('degree')>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "angle_rad.to(degree)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As an alterative, you can use `np.deg2rad`, which works with Pint quantities, but it also works with simple numbers and NumPy arrays:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "0.7853981633974483 radian"
      ],
      "text/latex": [
       "$0.7853981633974483\\ \\mathrm{radian}$"
      ],
      "text/plain": [
       "0.7853981633974483 <Unit('radian')>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.deg2rad(angle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:** Create a `Vector` named `a_force` that represents acceleration due to a force of 0.5 Newton applied to an object with mass 0.3 kilograms, in a direction 45 degrees up from the positive x-axis.\n",
    "\n",
    "Add `a_force` to `a_grav` from the previous exercise.  If that addition succeeds, that means that the units are compatible.  Confirm that the total acceleration seems to make sense."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}1.1785113019775793 & 1.1785113019775793\\end{pmatrix} newton/kilogram\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}1.1785113019775793 & 1.1785113019775793\\end{pmatrix}\\ \\frac{\\mathrm{newton}}{\\mathrm{kilogram}}$"
      ],
      "text/plain": [
       "array([1.1785113, 1.1785113]) <Unit('newton / kilogram')>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "N = UNITS.newton\n",
    "mag = 0.5 * N\n",
    "angle = 45 * degree\n",
    "theta = angle.to(radian)\n",
    "x, y = pol2cart(theta, mag)\n",
    "force = Vector(x, y)\n",
    "\n",
    "mass = 0.3 * kg\n",
    "a_force = force / mass\n",
    "a_force"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}1.1785113019775793 & -8.621488698022421\\end{pmatrix} newton/kilogram\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}1.1785113019775793 & -8.621488698022421\\end{pmatrix}\\ \\frac{\\mathrm{newton}}{\\mathrm{kilogram}}$"
      ],
      "text/plain": [
       "array([ 1.1785113, -8.6214887]) <Unit('newton / kilogram')>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "a_force + a_grav"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Baseball"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a `Params` object that contains parameters for the flight of a baseball."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>x</th>\n",
       "      <td>0 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>9.8 meter / second ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mass</th>\n",
       "      <td>0.145 kilogram</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>diameter</th>\n",
       "      <td>0.073 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rho</th>\n",
       "      <td>1.2 kilogram / meter ** 3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C_d</th>\n",
       "      <td>0.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>angle</th>\n",
       "      <td>45 degree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>velocity</th>\n",
       "      <td>40.0 meter / second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>10 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dt</th>\n",
       "      <td>0.1 second</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "x                             0 meter\n",
       "y                             1 meter\n",
       "g             9.8 meter / second ** 2\n",
       "mass                   0.145 kilogram\n",
       "diameter                  0.073 meter\n",
       "rho         1.2 kilogram / meter ** 3\n",
       "C_d                              0.33\n",
       "angle                       45 degree\n",
       "velocity          40.0 meter / second\n",
       "t_end                       10 second\n",
       "dt                         0.1 second\n",
       "dtype: object"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t_end = 10 * s\n",
    "dt = t_end / 100\n",
    "\n",
    "params = Params(x = 0 * m, \n",
    "                y = 1 * m,\n",
    "                g = 9.8 * m/s**2,\n",
    "                mass = 145e-3 * kg,\n",
    "                diameter = 73e-3 * m,\n",
    "                rho = 1.2 * kg/m**3,\n",
    "                C_d = 0.33,\n",
    "                angle = 45 * degree,\n",
    "                velocity = 40 * m / s,\n",
    "                t_end=t_end, dt=dt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And here's the function that uses the `Params` object to make a `System` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_system(params):\n",
    "    \"\"\"Make a system object.\n",
    "    \n",
    "    params: Params object with angle, velocity, x, y,\n",
    "               diameter, duration, g, mass, rho, and C_d\n",
    "               \n",
    "    returns: System object\n",
    "    \"\"\"\n",
    "    angle, velocity = params.angle, params.velocity\n",
    "    \n",
    "    # convert angle to degrees\n",
    "    theta = np.deg2rad(angle)\n",
    "    \n",
    "    # compute x and y components of velocity\n",
    "    vx, vy = pol2cart(theta, velocity)\n",
    "    \n",
    "    # make the initial state\n",
    "    R = Vector(params.x, params.y)\n",
    "    V = Vector(vx, vy)\n",
    "    init = State(R=R, V=V)\n",
    "    \n",
    "    # compute area from diameter\n",
    "    diameter = params.diameter\n",
    "    area = np.pi * (diameter/2)**2\n",
    "    \n",
    "    return System(params, init=init, area=area)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's how we use it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>x</th>\n",
       "      <td>0 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>9.8 meter / second ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mass</th>\n",
       "      <td>0.145 kilogram</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>diameter</th>\n",
       "      <td>0.073 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rho</th>\n",
       "      <td>1.2 kilogram / meter ** 3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C_d</th>\n",
       "      <td>0.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>angle</th>\n",
       "      <td>45 degree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>velocity</th>\n",
       "      <td>40.0 meter / second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>10 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dt</th>\n",
       "      <td>0.1 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>init</th>\n",
       "      <td>R                                   [0 meter, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>area</th>\n",
       "      <td>0.004185386812745002 meter ** 2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "x                                                     0 meter\n",
       "y                                                     1 meter\n",
       "g                                     9.8 meter / second ** 2\n",
       "mass                                           0.145 kilogram\n",
       "diameter                                          0.073 meter\n",
       "rho                                 1.2 kilogram / meter ** 3\n",
       "C_d                                                      0.33\n",
       "angle                                               45 degree\n",
       "velocity                                  40.0 meter / second\n",
       "t_end                                               10 second\n",
       "dt                                                 0.1 second\n",
       "init        R                                   [0 meter, ...\n",
       "area                          0.004185386812745002 meter ** 2\n",
       "dtype: object"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "system = make_system(params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a function that computes drag force using vectors:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "def drag_force(V, system):\n",
    "    \"\"\"Computes drag force in the opposite direction of `v`.\n",
    "    \n",
    "    V: velocity Vector\n",
    "    system: System object with rho, C_d, area\n",
    "    \n",
    "    returns: Vector drag force\n",
    "    \"\"\"\n",
    "    rho, C_d, area = system.rho, system.C_d, system.area\n",
    "    \n",
    "    mag = rho * V.mag**2 * C_d * area / 2\n",
    "    direction = -V.hat()\n",
    "    f_drag = direction * mag\n",
    "    return f_drag"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can test it like this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}-0.11719680972835739 & -0.11719680972835739\\end{pmatrix} kilogram meter/second<sup>2</sup>\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}-0.11719680972835739 & -0.11719680972835739\\end{pmatrix}\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$"
      ],
      "text/plain": [
       "array([-0.11719681, -0.11719681]) <Unit('kilogram * meter / second ** 2')>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V_test = Vector(10, 10) * m/s\n",
    "drag_force(V_test, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's the slope function that computes acceleration due to gravity and drag."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "def slope_func(state, t, system):\n",
    "    \"\"\"Computes derivatives of the state variables.\n",
    "    \n",
    "    state: State (x, y, x velocity, y velocity)\n",
    "    t: time\n",
    "    system: System object with g, rho, C_d, area, mass\n",
    "    \n",
    "    returns: sequence (vx, vy, ax, ay)\n",
    "    \"\"\"\n",
    "    R, V = state\n",
    "    mass, g = system.mass, system.g\n",
    "    \n",
    "    a_drag = drag_force(V, system) / mass\n",
    "    a_grav = Vector(0, -g)\n",
    "    \n",
    "    A = a_grav + a_drag\n",
    "    \n",
    "    return V, A"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Always test the slope function with the initial conditions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([28.28427125, 28.28427125]) <Unit('meter / second')>,\n",
       " array([ -6.46603088, -16.26603088]) <Unit('meter / second ** 2')>)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "slope_func(system.init, 0, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use an event function to stop the simulation when the ball hits the ground:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "def event_func(state, t, system):\n",
    "    \"\"\"Stop when the y coordinate is 0.\n",
    "    \n",
    "    state: State object\n",
    "    t: time\n",
    "    system: System object\n",
    "    \n",
    "    returns: y coordinate\n",
    "    \"\"\"\n",
    "    R, V = state\n",
    "    return R.y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "1 meter"
      ],
      "text/latex": [
       "$1\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "1 <Unit('meter')>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "event_func(system.init, 0, system)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can call `run_ode_solver`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>success</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>message</th>\n",
       "      <td>A termination event occurred.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "success                             True\n",
       "message    A termination event occurred.\n",
       "dtype: object"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results, details = run_ode_solver(system, slope_func, events=event_func)\n",
    "details"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The final label tells us the flight time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "5.004505488017051 second"
      ],
      "text/latex": [
       "$5.004505488017051\\ \\mathrm{second}$"
      ],
      "text/plain": [
       "5.004505488017051 <Unit('second')>"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "flight_time = get_last_label(results) * s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The final value of `x` tells us the how far the ball landed from home plate:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "99.30497406350605 meter"
      ],
      "text/latex": [
       "$99.30497406350605\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "99.30497406350605 <Unit('meter')>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "R_final = get_last_value(results.R)\n",
    "x_dist = R_final.x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualizing the results\n",
    "\n",
    "The simplest way to visualize the results is to plot x and y as functions of time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure to file figs/chap22-fig01.pdf\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3xUdb7/8deU9J5A6DUJ39A7SO8iHRFsWLCsZd11m+6617u7193r1d+irq7uylrWrlgARZpYAEGK9JbwhdATQkvvmcyc3x9nYAMCBkjmzCSf5+ORRzLnnMn5IJh3vt/zLTbDMBBCCCH8jd3qAoQQQogLkYASQgjhlySghBBC+CUJKCGEEH7JaXUBdU0pFQL0BbIBt8XlCCGEOJcDaAZs1FpXVD9R7wMKM5xWW12EEEKISxoCrKl+oCEEVDbAe++9R9OmTa2uRQghRDXHjx9n5syZ4P1ZXV1DCCg3QNOmTWnZsqXVtQghhLiwHzyCkUESQggh/JIElBBCCL8kASWEEMIvWfIMSinVD1iktU70vg4GXgKmY/ZDPqe1fqra9TcC/4c5FHEVMEtrfdLnhQshhPAZn7aglFI2pdS9wHIguNqpJwAFJGEOC79TKXWH9z2dgNeBWUACsA+Y68OyhRBCWMDXXXxPAA8C/3ve8TuBJ7XWeVrrQ8AzwP3ec7cBn2ut12ity4HfA4OUUik+qlkIIYQFfB1Qc7TWvYFNZw4opWIxu+7Sql23B+jq/bpT9XNa61LgaLXzQgghLJBXVM6xU8V19v19+gxKa33sAocjvZ9Lqx0rBcKrnS/lXNXPCyGE8KHD2YV8umo/K7ccxTDgjT9cS1x0aK3fxx8m6pZ4P4dVOxYOFFc7H8a5qp8XQghRxwzDYMe+08xflcGWPeYYNZsNhvdqSVRE8I+8+8pYHlBa6zyl1HHMQRJZ3sOp/KdbL817DgClVDjQmnO7BIUQQtSBKreHNduyWLByPweOFQAQHORgTL/WTB7anuaNIn/kO1w5ywPK6x3gT0qpHZhdeo8AL3jPvQ+sUUoNB9YBTwFbtdZ7rShUCCEagtJyF8s3HOGzb/dzOr8MgNioECYOase4ge2IrqNWU3X+ElB/BJ4FdmMO3HgFmAOgtd6plLrb+7oFsAGYYVGdQghRr+UVlvP5mgMsWXuIkjIXAC0TI7l+eDLDe7UkOMjhs1osCSit9UogttrrcuAh78eFrp8HzPNJcX5q/vz5PPnkkyxZsoQmTZrw3nvv8eqrr/LZZ58RExNjdXlCiACXebKIBSv3882mo1S5PQB0ahfPDSNS6NOxCXa7zec1+UsLym888dp6NqWf8Mm9+nRswp/uvaZG106bNo2vv/6aJ554gkcffZRnn32WOXPmSDgJIa6KPpzLvBUZrN+VjWGYAx8GdG3GtOHJpLaNt7Q2CagA8uc//5mJEydy1113cfvtt9OvXz+rSxJCBCDDMNiiT/LJN/vYtT8HAKfDzqi+rZg6LImWiVEWV2iSgDpPTVs0VkhISODaa69l7ty5TJ482epyhBABxu32sGb7Meat2MfBY4UAhIc6GTegLZOHJhFfB3OZroYEVADZuXMnCxcuZMKECfz3f/837733Hna7LEgvhLi0SpebrzceYf7KDI7nmOsexEWFMGVoEtcNaEtEWJDFFV6YBFSAKC8v57e//S0PPPAAd955J5MnT+a1117jvvvus7o0IYSfKi13sWTtIT77dj/5RRUANG8UwbQRyYzo3cqnI/KuhARUgHj22WcJDQ3lnnvuwel08pe//IV7772XoUOHkpqaanV5Qgg/kl9UwcLV+1ny3UFKyqsAaN8ihhmjUhjQtTkOC0bkXQkJqADx+OOPn/O6f//+7Ny506JqhBD+6FReGQtWZfDF+sNUutwAdElKYMbIDvRUjbHZAiOYzpCAEkKIAHfsdDGffL2PFZuPUuU2AOjXqSkzRqVYPlT8akhACSFEgDqUXcjHX+1lzfYsPAbYbTC0Rwumj0qhXfPAnyMpASWEEAFm75E8PvpqLxt2HwfA6bAxqncrpo9MoXnjulu81dckoIQQIkCkHczhwy/3skWb210EO+1ce00bpg1PoXHc+bsSBT4JKCGE8GNn9mH68Ku97Nx/GoDQYAcTBrVjyrAk4qL8a3JtbZKAEkIIP3RmOaK5yzV7DucBEBHqZOKQ9kwekuST7S6sJgElhBB+xDAMNqafYO5yzb6j+QBEhQczZVh7Jg5q77erPtQFCSghhPADHo/Bht3Hmful5kCWuXNtTGQw04YnM25gO8JCGt6P64b3JxZCCD/i8Ris25nN3C81h7LNBVzjokKYNiKF6wa0ITS44f6Ybrh/ciGEsNCZYPpg+R4OHy8CID46lOkjU7j2mjaE+Pk6eb4gASWEED7k8Ris3XmMucv12WBqFBPK9FEdGNOvtd8v4OpLElAB4g9/+APl5eXMnj377LExY8bw+9//npEjR1pYmRCiJs4E0wfLNUeqBdOM0WYwBTklmM4nAXWe7LlPUrZ/i0/uFZbUi2Y3P/7jFwJTpkzhvvvuo6KigpCQELZv305RURFDhgyp4yqFEFfD4zFYtyubD774T1deo9gwbhyVwmgJpkuSgAoQvXv3JjY2lpUrVzJ27FgWLVrE+PHjCQpqOENOhQgkhmGwflc273/xn8EPjWJCuXF0BwmmGpKAOk9NWzS+ZrPZmDRpEosXL2bMmDEsXbqUf/zjH1aXJYQ4j2EYfL/7OO8v/89w8YSYUGaM6sC1/SWYLocEVACZMmUK06ZNY+3atYSHh9O9e3erSxJCeBmGweY9J3nviz1keCfYxkeHeIOpjQx+uAISUAGkffv2JCUlMXv2bCZPnmx1OUII/rNW3rvL0s8uSRQXFcL0kSmMHdBWhotfBQmoADNlyhSefPJJXnzxRatLEaLB230gh3eXpbNrfw4A0RHB3DAihfGD2jboCba1Rf4LBphmzZrRq1cvWrdubXUpQjRYe4/k8e7SdLbuPQVAZFgQ1w9PZuLgdoSHysCl2iIBFSCKiorIysrilVde4ZZbbrG6HCEapIPHCnhv2Z6zGwWGhTiZOiyJKUOTGtQirr4iARUgDh48yB133MHQoUOZMmWK1eUI0aBknizigy80q7dnYRgQEuxg4qB2TBuR0iC2vbCKBFSA6NatG9u2bbO6DCEalJO5pXywXPPNpiN4DHA67Iwb2JYZI1OIi66/GwX6CwkoIYQ4T15ROR99tZdl6w5R5Taw222M7d+aG0d3IDEu3OryGgwJKCGE8CouczF/xT4Wrj5ARaUbmw2G92rJLWMVzRtFWl1eg+M3AaWUugb4O6CAU8DTWuvXlFLBwEvAdMANPKe1fsq6SoUQ9U15RRWfrznAvBUZlJS5AOjfuSm3jetI22bRFlfXcPlFQCml7MBnwG+01u8qpfoCq5VSG4GbMUMrCYgBlimlsrTWb1tXsRCiPnBVeVi+4TAffqnJK6oAoFtyI24f35HUNvEWVyf8IqCAOCARsCmlbIABVAGVwJ3ALK11HpCnlHoGuB+QgBJCXBGPx+DbbVm8tyyd4zmlAKS0iuWO8R3p0SHR4urEGX4RUFrrHKXUS8BbwBuAA/gFkA00A9KqXb4H6OrzIoUQAe/MenlvLU47u8J4qyaR3HZdRwZ0bYbNZrO4QlGdXwSUt4uvHLgVmAcMBOYD+d5LSqtdXgrIMBohxGVJO5jD20vS2X3AXJaoUWwYM8cqRvRuhcNht7g6cSF+EVDANGCQ1vpR7+tVSqnXMbv3AMKqXRsOFPuyOCFE4Dp8vJB3lqSfXf0hKjyYG0d3YPzAtrLCuJ/zl4BqBYScd6wKczTfccxBElne46mc2+UnhBA/cCqvjPe/2HN2km1osIMpw5KYNjxZ1ssLEP4SUMuBp5RS9wGvAr2AnwD3AkeAPymldgCRwCPAC1YVKoTwb0WllXzy9T4+X3MAV5UHh93GhIFtuWlMB+KiZPWHQOIXAaW13q2Umgb8BZiN2Wp6TGv9mVLqC+BZYDdgB14B5lhWrBDCL1W43Hy++gCffLPv7FymoT1aMHNcqkyyDVB+EVAAWuslwJILHC8HHvJ+CCHEOdwegxWbjvLesnROF5QD0KNDY+4c34nkVrEWVyeuht8ElBBCXI4LDRlv3zyGWRM70VPJXKb6QAJKCBFw9h3N481FaezIOA1AYlwYt4/ryNCeLbHbZS5TfSEBJYQIGMdzSnhnaTrfbjUH9UaGBXHTmA6MH9hOhozXQxJQQgi/V1RayUdf7WXRmoNUuT0EOe1MGtyeGaNSiAyXDQPrKwkoIYTfclW5WbTmIB99tZdi78i8Eb1bctu4jrIvUwMgASWE8Dsej8HqbVm8vTSdk7nmSmfdUxpx18TOJLWUkXkNhQSUEMKv7D6Qw+sLd7HvqLkUZ5umUcya2JneqYmymGsDIwElhPALx04V8+biNNbtzAYgLiqEmdd1ZHS/1jhkZF6DJAElhLBUYUklH36pWfzdQdweg5BgB9OGJ3P98GTCQuRHVEMmf/tCCEu4qjws/u4Ac7/cS0mZC5sNRvdtzW3jUkmICfvxbyDqPQkoIYRPGYbBup3ZvLkojeycEgB6pDTm7smdadc8xuLqhD+RgBJC+EzG0XxeW7jr7KaBLRMjuXtSZ/p0bCIDIMQPSEAJIepcTkEZby9J55tNRwFz08CZYxVjB7TFKbvZiouQgBJC1JnyyioWrMhg3soMKirdOB02Jg1J4sbRHYgMk00DxaVJQAkhap3HY/Dt1kzeWpx2dguMAV2bcdfEzjRrFGFxdSJQSEAJIWrVnsO5vPbpLvSRPADat4jh3ild6JrUyOLKRKCRgBJC1IpTeWW8tTiNVVszAXOi7R3jOzKij0y0FVdGAkoIcVXOPGf6ZEUGlS43QU471w9P5oYRyYSHynMmceUkoIQQV8QwzAVd31iUxun8MgAGd2/OrImdaRIvK42LqycBJYS4bBlH83nl052kH8oFzOdM903tSuf2CRZXJuqTGgeUUqoJ0BtIBNzAcWCL1jqnjmoTQviZvMJy3lmazlcbj2AYEBsZwu3jOzKqrzxnErXvkgGllHICtwK/BLoDlUAe4ADivddsAP4JzNVae+q0WiGEJVxVHj5ffYC5X2rKKqrOzme6aXQHImQ+k6gjFw0opdQw4GXgGPA6sAw4oLU2vOdtQGdgKPAz4H+UUvdprVfWddFCCN/ZlH6C1z7bSdYpc928vp2acO/kLjRvHGlxZaK+u1QL6jfATVrrnRc66Q2qXd6PfyqlegJ/BlbWdpFCCN/LOlXMa5/tYlP6CQBaNI7kJ1O70Du1icWViYbiogGltZ58Od9Ia70VmHTVFQkhLFVa7uLDL/eycPV+qtwG4aFObrlWMWFQe4Kcsm6e8J3LGSQRDrQDQs4/p7XeUptFCSF8z+MxWLklkzcX7SavqAKbDcb0a83t4zsSFxVqdXmiAapRQCmlbgPmAGHA+UN1DMxBE0KIAJWRmc+/5u9gz2FzeSLVOo77p3UlpVWcxZWJhqymLainMAdKPAeU1105QghfKiiu4J2l6SzfcNgcNh4VwqwJnRjRuxV2GTYuLFbTgIoGXtJaH67LYoQQvuH2GCxbd4h3l6ZTXObCYbcxaWh7bh6jZNi48Bs1Dah3gFnA43VXihDCF9IP5jJn/g4OHCsAzO3W77u+K62aRFlcmRDnqmlAzQa2KKVmAoeAcybkaq1H1nJdQohalldYzpuL087uats4Lox7J3dhQNdmst268EuX04IqBhYDpXVXjhCitlW5PSz+7iDvf7GH0vIqnA47N4xIZvqoFEKDZTlO4b9q+q+zL9Bfa72jrgpRSjXDXLliBOZAjFe01n9QSgUDLwHTMdcAfE5r/VRd1SFEfbJr/2nmzN/B4eNFAPTp2ISfTO1C80ayCoTwfzUNKA3E1mUhwGfAZqAJ0AxYpZRKB7oCCkgCYoBlSqksrfXbdVyPEAErr7Ccfy/azcrN5uaBTeLDuW9qV/p1bmpxZULU3OUMM39TKfUSsB9wVT+ptV5yNUUopfoD7YFBWmsXcFApNRwoA54BZmmt84A8pdQzwP2ABJQQ53F7u/Pe83bnBTntzBiZwrSRKYQEyXRFEVhqGlAfeD8/c4FztTFRtzewE3PB2VmYXXz/xJx71QxIq3btHsxWlRCimt0HcpgzfweHsgsBszvvvqldadYowuLKhLgyNQoorXVdL8AVDwwBVmG2pFIxV08/5T1ffWBGKSDbdQrhVVBcwRuLdvP1RnN0XmJ8OPdLd56oBy653YbWetXlfDOl1Eit9TdXUEcFUKi1/h/v6+1KqdeAO72vw6pdG445olCIBs3tMVi+4TBvL06juMxljs4bmcyMUR2kO0/UC5dqQf1KKfUY8HfgK++zoR/wbmo4EXNPqFLgSgJqDxCulArWWldWqy0Pc+deBWR5j6dybpefEA1OxtF8/jlvO/uO5gPQs0NjHpjWTfZoEvXKpbbbmKqUuh54GmijlFoJ7AZOYy4Y2xhzl90BwBHgL1rrT66wji8xu/OeVUr9BjOQ7gEeBA4Af1JK7QAigUeAF67wPkIEtOIyF+8uTWfJ2oMYBiTEhPKTKV0Z2E0m24r655LPoLTWC4AF3hF14zHDqAnmShLHMYeFP6W1Xn01RWity707+L4IZGMOkvir1nqeUmox8CxmONqBVzBXVheiwTAMg1VbMnn9893kF1Vgt9uYMrQ9t1yrCA+VtfNE/VTTQRIrqeOdcrXWB4AJFzheDjzk/RCiwck8WcTL83awI+M0AJ3axfPgDd1p2yza4sqEqFuyzokQfqrC5ebjr/cy75sMqtweosKDuXtSZ0b1bSXdeaJBkIASwg9t3nOCOfN3cDzHnGExpl9rZk3sTHREsMWVCeE7ElBC+JHcwnJe/XQna7YfA6BN0yh+Or07ndolWFyZEL4nASWEH3B7DJatPcjbS9MpLa8iJNjBLWMUU4Yl4XTU9Tx5IfxTjQNKKZUIdAOCMIeZn3W1a/EJ0ZAdyCrgH59sY+8Rc05T305NeOD6biTGy4IpomGrUUAppe7BXBvvQuNZa2MtPiEanLKKKt7/Yg8LVx/A4zFIiAnlvqldZQNBIbxq2oJ6FHgV+L3WuqgO6xGiQfh+93Fenr+D0/ll2G0weUh7Zl6XKnOahKimpgHVCnhBwkmIq5NTUMYrn+5k7Y5sAJJaxvCz6T1IblXX260JEXhqGlDLgVHAvjqsRYh6y+MxWLb+EG8tTqO0vIrQYAe3jevIxEHtcMggCCEuqKYBtR14Tik1GdgLVFY/qbX+bW0XJkR9cTi7kJc+3saew3mAdxDEtG4kxskgCCEupaYBNQzYgLntRffzzhm1WpEQ9USly83cLzXzV2Tg9hjER4dw39RusrCrEDVU07X4RtR1IULUJzszTvPSx9s4droEgHED23Ln+E5EhMkgCCFq6nLmQTXB3POpM+aq4unAq95FXoUQQHFpJf/+fDdffn8EgFZNovj5jB50bBdvcWVCBJ6azoPqh7ln01FgLeZE3YnAz5VSw7XWm+quRCH8n2EYrNl+jFc+3Ul+UQVOh50bR3dg+shkgpwyTVCIK1HTFtSzwAfAg1rrs8+clFIvAbMB6QIUDdbp/DJenreD79OOA+Z2GD+b0YNWTaIsrkyIwFbTgOoD3Fs9nLxexNy0UIgG58zQ8TcXpVFWUUV4qJNZEzsztn8b7HYZBCHE1appQGUDbQF93vH2gEzeFQ3O0RNFvPTxNtIO5gJwTZemPDCtGwkxYRZXJkT9UdOAegd4RSn1S2C999gA4G/ec0I0CFVuD/NW7GPu8r1UuT3ERoXwwLRuDOrW3OrShKh3ahpQTwLNgY8wR/DZABdmF9/jdVOaEP5l39E8/v7hNg5lFwLmJoJ3T+pMZLhsIihEXajpPKhK4CdKqUcABZQBGVrrsrosTgh/UOFy8/6yPXy6KgOPAU0TwvnZ9B5079DY6tKEqNcuGlBKqfHAl1prl/fr87VSSgGyH5Sov3btP83fP9pG9ukS7DaYOiyJmdelEhose30KUdcu9X/ZIqApcNL79cXIflCi3iktd/HW4jSWrD0EQOumUTx8Yw9UG5lwK4SvXDSgtNb2C30tRH23ec8JXvp4O6fzy3DYbcwY1YEbR6fIhFshfKymK0l8A0zTWuefd7wxsExr3bsuihPCl4pLK3n1s118s+koAMktY3j4pp60ax5jcWVCNEyXegY1HOjkfTkMuF8pdf6cp45AUt2UJoTvbNiVzT/nbSe3sIIgp52ZY1OZOixJ9moSwkKXakHlAI9gDim3AQ8B7mrnDaAY+E2dVSdEHSsoruDVT3examsmAB3bxvPwTT1omSjLFAlhtUs9g9qJuVIESqkVmF18eb4qTIi69t32Y8yZv4P84gqCgxzcOb4jEwa3xyHLFAnhFy7VxReutS71vpxw5tiFrq12nRB+r6C4gpfn7+C77ccA6JKUwMM39qRZowiLKxNCVHepLr4ipVQzrfVJzK68C+2ca0OGmYsAsmZ7Fi/P20FhSSWhwQ5mTezMuAFtZXFXIfzQpQJqJJDr/Vq20xABraC4gjnzd7DG22rqltyIh2/qSZP4C3YKCCH8wKWeQa260NcASqlgoBuwV2tdWHflCXH1vttxjJfnbaeg2Gw13TWpM9ddI60mIfxdTedBJQOvA78DdmDuqtsNKFBKjdNar7/U+y+HUirWe48/aq3f9IbhS8B0zFGEz2mtn6qt+4n6q6C4gn8t2MnqbVmA2Wr6+Y09aJogz5qECAQ1XVDsRcx9nw4BtwMtMReNvQt4DhhYizXNAVpUe/2E915JQAywTCmVpbV+uxbvKeqZ9buy+cfH28kvrpBnTUIEqJoG1BCgp9b6uFJqKrBYa71PKfUq8MvaKkYpdScQDeysdvhOYJZ3iHueUuoZ4H5AAkr8QHFpJa98upMVm815TV2SEvjFTT2l1SREAKppQJUDQUqpCMxVJe72Hm8KFNRGIUqpdsCfMFtjy7zHYoFmQFq1S/cAXWvjnqJ+2bznBH//cBu5heVn5zVNHNxeWk1CBKiaBtQXwKuY3XylwOdKqVHAC8DCqy1CKeUA3gUe8bbSzpyK9H6uPs+qFJChV+Ks0nIXry/czfINhwFIbRPHL2/pRYvGkT/yTiGEP6tpQN2PuatuG2CC1rpEKdUXWAk8Wgt1/AHQWuv55x0v8X4Oq3YsHHNelhDszDjN83O3cDKvDKfDzu3jUpkyLFlWgxCiHqjpjrrFwC8AlFLRSqlYrfXTtVjHzUBzpdQ07+so4J9AP+A45iCJLO+5VM7t8hMNUIXLzdtL0lj47QHAXHn8l7f0ok3TaIsrE0LUlhpvC6qUehD4L6C59/VJ4IXaCCqtdep599oGPO8dZl4M/EkptQOzy+8RzK5F0UDtO5rHc+9vIfNkMXa7jZtHd2DG6A44ZeVxIeqVms6DegSzG+5JYA3mEkeDgMeUUmVa67oMjD8CzwK7ATvwCuZQdNHAVLk9fPTVXj78ai8ej0GrJpH86pZepLSKs7o0IUQdqGkL6iHgAa31B9WOfaeUOgz8L7XcotFa96j2dbn3/g/V5j1EYDl6oojn3t9MRmYBNhtMGZrE7eM7EhIky0AKUV/VNKAaAxsvcHwz5qRdIeqEx2Ow6LsDvLUojcoqD4lxYfzy5l50TW5kdWlCiDpW04DaBcwAzl9i6CbMeUlC1LrT+WW8MHcr2/adAmB039b8ZGoXwkODLK5MCOELNQ2oPwKLlVIDgHXeYwOA64BpF32XEFdo1ZZMXp6/g5IyF9ERwfxsRg8GdG1mdVlCCB+q6TDz5d6JuT/HXIuvDEgH+mqtt9dhfaKBKSqtZM68HXzrXeC1b6cm/PzGHsRFhVpcmRDC12o8zFxr/S3wbR3WIhq47XtP8be5W8gpKCc02MG9U7pybf/W2Gwy6VaIhuiSW74Dz2Nuc1EBLAAek/2fRG2rdLl5Z2k6n67aD5hLFf361t6yBbsQDdylWlBPAJOAv2Luw/QzIAFzYIQQteJQdiHPvreZQ9mF2O02br1WMX1kCg6ZdCtEg3epgJoO3Kq1XgGglFoFfKuUCtJau3xSnai3PB6Dz9cc4K3FabiqPDRvFMFvZvamQ2uZdCuEMF0qoFpy7hDyjZgrOTQBMuuyKFG/5RSU8fwH/xk+PvaaNtw7uQuhITV+JCqEaAAu9RPBgdm1B4DW2lBKVQDBdV6VqLfW7TzGix9to6jUHD7+8I096N9Fho8LIX5IfmUVPlFeUcVrC3fxxXpzz6ZeqYn88qaexEU3vOHjhmFguF1Q5cIwDPOgzYbN+/nsa2cwNrss5SQarh8LqFne1cSrX3+bUup09Yu01v+s9cpEvZGRmc8z724m61QxQU47syZ2YtLg9gE7fNzwuHGXFOAuycddnG9+LinAXV6Mp7wUT0WJ97P364oyDLcLo8plBpO7quY3s9mxBQWbYeUMxu4MxhYcij00AkdoBPaQCOxh3s+hkTgiY3BGxOGIjMUREYs9uOH9AiDqj0sF1BHgwfOOHQfuOu+Ygbl3kxDn8HgMFqzM4N1l6VS5DVo3jeLR2/rQtpl/79nkqSjFlX+SqvyTVBWeoir/JK4C83NVUQ6e0iLMf/ZXweHE5gjCZreDYZjf7UxrCsM8VuUCw4NRWY5RWQ5U63OvIVtwKM7IOByRcThjEnHGNCYo1vzsjE3EGZWAzSEdKcI/XfRfpta6rQ/rEPVMTkEZf/tgC9v3mY3tiYPaMWtSZ79ZfdwwDNyFp6nMycKVk4XrdNbZr93FeT/ybhuOiBgcEWYrxWytxOAIi8IeEm62ZkLCsYean20hodidIWYQOIOwOZzYbD8+jN4wDPC4Maoq8bgqMarMD09lOZ7yErN1VlZsttTKi3GXFZ/bsivOw6gsx5WbjSs3mwvu82mzm6GV0ILghOYEJbQgqFELguJb4IiICdhWrqgf5FcnUeu+332c5+dupai0kpjIYH5xU0/6dmpqWT2G20Xl6Swqjx+g4sQhKk8cpOLEIYyK0gteb3MGm62LmESCzrQ0Yhp7WyCNcIRH++TZkM1m87a0nNhDwi/7/YZh4KkoxTkzC/gAAB1aSURBVF2cR1VRDlUFp6jKP0VVwUmqCk7hyj+JuyiXqvwTVOWfoGz/lnPebw+NJDixjfnRpA0hiW0JatwKe1BIbf0RhbgkCShRaypdbt5YtJtFaw4C0LNDY351Sy+fDoQwDIOq/BOUZ2oqsvZSnrWXylNHLvjcxx4eTXCjlmbrwfs5KKEFzphGNWrh+DubzYbD+6wquNGFd8Uxqly48o7jyjlmtiBzzdakKycLT3kx5Ud2U35kd7VvaicooTkhTdsT0jzF/GjSFptTVpgXtU8CStSKI8cLmf2uuSKE02Hj9nGdmDosCbu9bruIDHcVFccyKD+abobSsb24Swp+cJ0zrikhTdsR3KQdIU3aEdy0Hc5ImRRscwYR3LgVwY1bUX1hKcMwcBfnUXniEJUnD5ktz5OHceUcw3U6E9fpTIp3eZfmtDsJadKWkObJhLRIIbRVR5wxidI9KK6aBJS4KoZh8MX6w7z62S4qXW6aN4rg0dv6kNwqtm7u53FTeeIQZYd2UnZoF+VH0zFc5edcYw+PJrRFB0JbKkJadCCkafsr6iJryGw2G86oeJxR8YQn9zp73OOqwHXqKBXZ+yk/to+KY/twnc6iIjuDiuwM2LwMAEdUAqGtOxLWqhOhrTsS1KhlvWiVCt+SgBJXrLjMxYsfbWXtjmwARvVtxf3XdyOslleEqCrMoTRjM6UHtlF+eDee8uJzzgc1aklo606EtlSEtlA445rKb+91xB4UYraUmicT3XssYI56rMjeT8WxfZRn7qU8Mx13UQ4lu9dQsnuN+b6wKEJbdyK8XTfC2nWXvyNRIxJQ4orsOZzL7Hc2cTKvjLAQJw9N786wXhd+znG5DI+bimP7KN23mdKMLVSePHTOeWdMImFtuxLWtiuhbbrgjJKuOivZQ8LP/n0AGIYH16lMyo+mUXYkjfIj6biLcynVGyjVGwDv32G7boS1705Y2644wqKs/CMIPyUBJS6Lx2Mwf2UG7yxNx+MxSG4Vy+9u70PThKvbGsPjqqDswHZK9HpKM7bgKSs6e84WFEpYu66EJ/UirH13gmKbXO0fQ9Qhm81OcGJrghNbE937urMDV8oO7jA/Du2kquAkRdu+omjbV4CNkBYdCE/pTXhyb4IT20jrSgASUOIy5BWV87f3t7B1r7nI69RhSdwxvhNBzit7tuCpLKf0wFZK0tdRmrH57GRUMAc1hCf3Ijy5N2GtO8sosQBms9kIimtKUFxTontdaz5HPH6Q0oM7KDu4nfLMPVRkaSqyNHkr38cR3YiI5N6Ep/QmtE0XGdbegElAiRrZtvckz76/hfyiCqIjgvnVLb3o0/HyWzJGlYvSjM0U715NacYWjKrKs+eCmyYR2fEawlV/guKby2/R9ZTN7jj7HCtu0DQ8FWWUHdxBacYmSjO24C48TeGWLyjc8gW2oFDCk3sSkTqA8KRe2EPCrC5f+JAElLgkt9vD+8s1H3+9F8OArkmN+M3MXiTE1PwHhWEYVGRqinauoiR97TmDHEJadCAidQARqf2l666BsoeEEZHan4jU/hiGh4rsA5Tu20Tpvk1UnjhISfo6StLXYXMEEda+BxGp1xCe0gdHWKTVpYs6JgElLiqnoIzZ725m94Ec7Da45VrFjWMUjhrObXLlHado5yqKd31LVd7xs8eDm7QjsutQIjsOxBndqK7KFwHIZrMT2jyZ0ObJxA+7GVfBSUr2bKBkz3oqMjWl+zZSum8j2J2Et+9OZJchhKf0lUVx6ykJKHFBW/ac5Nn3N1NYUklcVAiP3taHrsk/HiaG20WJ/p6irV9Sdmjn2eOOqHgiuwwlqsswghNb12Xpoh4Jikkktv8kYvtPoqoojxK9gRK9nvLDu82pBxmbsQWFEN6hL5GdhxDevjs2hzyvrC8koMQ53G4P732xh4+/3gdAjw6N+fWtvYiLuvRvqK7cbAq3fUXR9m/wlBYC5pp2ER0HENl1GGFtusjeRuKqOKPiiOlzHTF9rsNdUkBx+lqKd6+mIlOfnXNlD4skInUgUd1HENI8RZ5jBjgJKHHW6fwyZr+7ibSDudhtcOt1qcwY2eGiyxUZHjelezdRuHnpOa2l4MTWRPW8lsguQ3GEXt3wcyEuxBERQ0yfccT0GYcr/wTFu7+jePdqXKeOULR1OUVblxPUqCVR3UYQ2WWYzJULUBJQAoAt+iTPvmd26cVHh/Lobb3pknThLj1PeQmF27+hcOMSqgpOAt7WUqdBRPe6Vn5zFT4VFNuEuEHTiBs0jYoThyjeuYriXatwnc4k95t3yF3xHuFJPYnsPoKIlD7SBRhAJKAaOLfH4IPle/joK3OUXi+VyK9v7UVM5A/nnrhysynYtISi7d+cnbPkjGtKTJ9xRHYbIa0lYbmQJm0JadKW+BEzKd2/laLt35x9VlWasRlHRAyR3UYQ3XMMQXHWbQEjakYCqgHLKyrnmXc3syPjNHYbzLwulRmjftilV56pyV+7gNJ9mzizk2xomy7E9JtIeHIvebYk/I7N4SSiQ18iOvQ1n1ftXk3htq9xnTpCwbpPKVj3KWHtuxPdcyzhKb1lV2E/JX8rDdTO/aeZ/c4m8ooqiI0M4ZHbetM9pfHZ84ZhUHZwB/lr51F+2LsfkMNJZOehxPSbQEiTttYULsRlckTEENNvItF9J1CRpSnc8iUlad9RdmA7ZQe244iMI6rHKKJ7jcUZFW91uaIavwkopdQY4GkgBTgJzNZa/0spFQy8BEwH3MBzWuunrKs0sHk8BvNW7OPdpel4DOjcPoHf3t6HeO+mgobhoVRvJH/tPCqy9wNgCwknpvd1RPedgDOybrbREKKu2Ww2QlumEtoyFfeYWRTvXEXhli9w5Rwjf80n5K9dQETqNcT0nUBIiw7yHNUP+EVAKaVaAfOAO4HPgN7AF0qpQ8BwQAFJQAywTCmVpbV+25JiA1hxaSXPvr+FTeknAJgxKoWZY1NxOOwYHjclaWvJ++4TXKczAXNfpdj+k4juNRa7PF8S9YgjLOpsq6r8SBqFm5aac6zSvqMk7TtCmiUT3Xc8kR0HyjqQFvKLgALaAu9rrRd4X29USq0EBmGG1iytdR6Qp5R6BrgfkIC6DBmZ+Tz91kZO5JYSGRbEr2/tRd9OTTEMg5I968n9di6uU0cBcEQ3IvaaKUT1GCULdYp6zWazEdamM2FtOlNVcMpcA3Drl1RkZ3Bq4d/J/fptonuPJbr3dTjCo60ut8Hxi4DSWq8GVp95rZSKB4YA7wDNgLRql+8Buvq0wAC3fMNh5szfgavKQ3LLGB67sx+JcWGU7ttM7qoPqDxxEABnTGNiB08nquswGYorGhxnTGPiR9xG7OAZ5qCKjYupPHmEvG8/JH/tAqK6jySm/yQZ/edDfhFQ1SmlYoCFwAZgs/dwabVLSgHZv7sGKlxu/jV/B19+fwSAsde04b6pXXFn7ubYwg+oyNoLgCMynrjBNxDVY5QEk2jw7EEhRPcYTVT3UZQf3kX++s8o27+Vws3LKNyynAjVn5hrphDaIsXqUus9vwoopVQHzGdQacBM4MyS2dWXzg4HihGXdDynhKfe3MiBYwUEO+08eEN3hrY1yPnk/yg7sA3wPmMaOI3oXtdKV54Q57HZbGd3Cq48eYT8DQsp3rWakj3rKNmzjtDWnYgdOI2w9j1kQEUd8ZuAUkoNxQynOcB/aa0NoFwpdRxzkESW99JUzu3yE+fZlH6CZ97bTEmZi2YJETw2I5kovYjMr1aA4cEeEk7MgKnE9B2PPVj21xHixwQntiZx0s+IH3aLOVl9y3LKj6Rx/EgawU2TiBs0jXDVD5vtyjbvFBfmFwGllEoCFgGPa61fPO/0O8CflFI7gEjgEeAFH5cYEDwegw+/1HzwpcYwYFDHeGa1O0rZgn9T5KoAu4PoPuOJGzxDHvgKcQWc0QkkjLyduEE3ULhlOQUbFlJ5fD8n5s0mqFFLYgfdQGSnQTJ5vZb4RUABDwFRwFNKqepznP4B/BF4FtgN2IFXMFtZoprqQ8jtNoNf9Ckl+eTnlK7PAyBc9Sdh5G0ExTe3uFIhAp89JJzYAVOJ7jOOom1fk7/+M1ynMzn12QvkrZpL7MBpRHUbLitUXCWbYRhW11CnlFJtgYNff/01LVu2tLqcOnHwWAFPvbmR7JwSVEQ+9zXbgTP3EAAhzZKJH30nYa07WVukEPWY4XZRtHMV+WsXnN2c0xmbSNzgGUR2HSYtqkvIzMxk1KhRAO201oeqn5N4D3Art2Ty4kfbcFaVcG/jNLq6d0OugSMyjvhRdxDZebD0iwtRx2yOIHPkX7cR5oT3NR/hyjnGqUX/IO+7ecQNmUFk5yESVJdJAipAud0e/r1oN59/m8GAkAyuT9hOsLsM7A5i+k0gbvCN2ENkAIQQvmSzO4jsMoSITgMp3r2GvNUfUZV3nFMLXyR/zTzihtxIRKeBElQ1JAEVgAqKK/jrO5vIPaj5TfR6WjlzwAOhbbvS6Np7CG7cyuoShWjQbHYHUV2HEdl5MMW7viVv9ce4co9x8rPnCVo7n/jhtxKe0keGp/8ICagAk5GZz+w3v6Nf+Xruik7HbjNwRCWQMGYWEakD5B+8EH7EZneYu/p2HmI+o1r9Ea5TRzjx8dOEtFTEj5hJWOvOVpfptySgAsjKzUf5Yt5i7g1dR0JYMdhsxPSbRNzQm2Q+kxB+zOZwEt1jFFFdhlK4dTl5az6hIlOT/c4fCUvqSfzwmYQ0bWd1mX5HAioAuN0e3v10IyHbP+EnEQcACEpsQ+KEnxLSPNni6oQQNWVzBhHTdwJR3UZS8P3n5K9fSNn+rWTt30pE58HED59JUGyi1WX6DQkoP1dQXMEnr71L36KviQypwGN3kjDsJmL7T5Y5FkIEKHtIGHFDbiS611jy186nYPMySnavoWTPemL6jid24A04wiKtLtNy8hPOjx08kEn6B88zgoNgB3eiou0NPycovpnVpQkhaoEjIoaEMXcR3W8CeSs/oHjXtxSsX0jR9m+IGzyD6N5jG/QCzhJQfmrL8qU4N7xLqr2cSoKIHnEHzQaMk0EQQtRDQTGJJE75BTH9JpLz1VuUH9lNzpdvULBpKfEjbiMi9ZoG+f++BJSfcZUWs+Xt52mcsxXscDKkDV1nPUpEI2k1CVHfhTRLotltT1C6bxO537yNK+cYJ+c/Q2irjiSMuZuQZu2tLtGnJKD8SL7eQuaCv9PYXUSl4eBk+/EMvvl27DKpT4gGw2azEdGhL+FJPSna9hW5335I+dF0sv79W6J6jCJu2C04I2OtLtMnJKD8gKeqkswlb1C1cznhwBF3Y6Kv+ylD+3WzujQhhEVsDifRva8jovMQ8td8TMHGJRRt+4ri9LXEDZ5OTN/x9f75lASUxSpPZ3Lkw9nY8zNxGza+s/dl1H3306ppw/gNSQhxaY7QCBJGzyKq5xhyvnyTsv1byP36bYq2fkn86FlEpPSxusQ6IwFlEcMwKNr+NSeXvo7dU8kpdxQbEiZz992TiAyr378VCSEuX3BCC5rd/DilGVvI+eoNXDnHOPHRU4Qn9ybh2rsJimtqdYm1TgLKAu7yEk4tmUNp+lrswPcV7SntfhMPTe2FwyErjwshLi48uRdh7bpRsGkpeas/ojRjM2UHdxA7cBoxA6ZgDwqxusRaIwHlY+WZmuMLnsNTeJpyw8m80mvoN/l6br6mrdWlCSEChM3hJLb/JCI7DSb3m7e9C9J+SNHOFSRce0+96faTgPIRwzAo+H4RuV+/DYaHI1UJfOIeyf33jKZrUiOryxNCBCBnVByJU35BVM/RnF72mrkQ7UdPEZ7Sx+z2i21idYlXRQLKBzwVpZxa9E9K9qwD4JuyTmyLGsp/3zuQpgkRFlcnhAh0Ya070/Ke2Wa337cfUrpvE2UHdxA35EZi+k8K2GXRArPqAFJ56ggn5s3GlXOMciOI94oH4kzqy/+7rQ8RMhhCCFFLqnf75Xz1BiVp35G74l2Kdn1L4/H3E9oy1eoSL5sEVB0q3rWaU0texnBVcKwqln8XD6f/wO7cO7mLDIYQQtQJZ1QcTa7/NaXdR3J66Su4Th3h2FuPE9XzWuJHzAyoRWgloOqAUeUi56s3Kdy8DICNFe35pLQ/s6b2YsLghrVUiRDCGuHte9Dyvr+R/9088td9RtHW5ZTu3UDCmLuI6DQ4INb2k4CqZVXF+ZyY91cqMjVuHMwr6cMWOvHYvX3pnRrYDyyFEIHFHhRC/PBbiew8hNNL/0X50XROfvo8YTtX0Xjc/ThjGltd4iVJP1Mtqsg+QNa/f0tFpqbQiOD5grHsC+/B7J8PlXASQlgmuHErmt3+ZxpNeBB7aARl+7dy9JVfUrBxCYbhsbq8i5IWVC0pTvuOU5+/hFFVySF3Iq8VDqN5q+b87939iIsKtbo8IUQDZ7PZie4xmvDk3uR88Tole9aRs/x1itPW0HjCTwlu1NLqEn9AWlBXyTA85K78gJMLnsOoqmRDRTJ/LxhDt25JPPnTQRJOQgi/4oyMo8kNj9Dkht/iiIilIlOT+dpvyFv9MYbbZXV555AW1FXwVJZx8rO/U7r3ewxsLCjpw6qKVG4YkcId4ztht/v/Q0ghRMMUkdqf0LZdzIVnt31F3rdzKdmzjsaTfkZIU/8YzCUtqCtUVXCKY2/9F6V7v6fSHsrLhaNYXdmRn97QnVkTO0s4CSH8niM0gsYTHqTZzP/BGduEypOHyXrjMXJXzfWL1pQE1BWoyD5A1huPUXnyCPn2OP6aex2H7a34wz3XMG5gO6vLE0KIyxLWtistf/Ic0X3Gg8dN/pqPyfr3Y1QcP2hpXRJQl6k0YzPH3vkD7pJ8DtOCp3PG4o5M5OmHBtOno4zUE0IEJntwKI3G3kOz2/7sbU0dIuuN31nampKAugyFm7/g+EdPY7jK2eZJ5oXc4TRp2ohnHh5KUkvZYFAIEfjC2nS+QGvqd1ScOOTzWiSgasAwPOR88w6nl70ChoevK7vzRv4AuqQ04emHBtM4LszqEoUQotb8sDV1mKx//478tfMxPG6f1REQo/iUUt2BOUA34ABwt9Z6oy/u7amq5NTnL1GS9h2Gzc6HJdewrjyZ4b1a8vBNPQlySsYLIeqnM62p3K/fpnDLF+SueI+SfZtInPywT3bw9fufrkqpYOAz4EMgFngSWK6UivbF/XO+NFcFdttDeLlgJOvKk5k+MoVf3dJLwkkIUe/Zg0NpNO4+mt783zgi4815U6/+hsItyzEMo27vXaffvXYMB4K01s9rrV1a67nAbuAmX9zcGd+SvNAWPJN3LXvdzXng+q7cOUHmOAkhGpbwpJ60vO85IjoPxnCVc3rpvzg+90mqinLr7J6BEFCdgPTzju0Buvri5vNPtOF/jo3itC2B39/ZV1YjF0I0WI6wKJpM/RWJ1/8ae2gkZQe2kvX6o3jKS+rkfoHwDCoSKD3vWCkQ7pObhwfRrFEEv7q5Fx3bxfvilkII4dciOw0itFVHTi97FVfuMbDXTVsnEAKqBDh/mFw4UOyLm980WnHTaOWLWwkhRMBwRsXTdMbv6vQegdDFlwacnxCp3uNCCCHqqUBoQa0AbEqpXwEvATdgDjdfYGlVQggh6pTft6C01pXAOMxgygUeB6ZqrU9ZWpgQQog6FQgtKLTWu4DBVtchhBDCd/y+BSWEEKJhkoASQgjhlySghBBC+KWAeAZ1lRwAx48ft7oOIYQQ56n2s9lx/rmGEFDNAGbOnGl1HUIIIS6uGbC/+oGGEFAbgSFANuC7jUyEEELUhAMznH6whZKtrpdLF0IIIa6EDJIQQgjhlySghBBC+CUJKCGEEH5JAkoIIYRfkoASQgjhlySghBBC+CUJKCGEEH5JAkoIIYRfaggrSVwxpVR3YA7mDr4HgLu11j+Y7dxQKKX6AYu01olW1+JrSqkxwNNACnASmK21/pe1VfmeUmoi8H9AO8z/Dn9tiP8dAJRSscAO4I9a6zctLsfnlFJ3A/8CKqodfkhr/VZt3UNaUBehlAoGPgM+BGKBJ4HlSqloSwuzgFLKppS6F1gOBFtdj68ppVoB84D/xfy3cAvwlFJqrKWF+ZhSqhnwCfA7rXUUMAN4XinVy9rKLDMHaGF1ERbqBTyrtY6s9lFr4QQSUJcyHAjSWj+vtXZprecCu4GbrC3LEk8AD2L+gG6I2gLva60XaK093lb0SmCQpVX5mNY6G2istV6qlLIDCUAVUGRtZb6nlLoTiAZ2Wl2LhXoD2+ryBhJQF9cJSD/v2B6gqwW1WG2O1ro3sMnqQqygtV6ttX7gzGulVDzmAsRbravKGlrrIqVUOGa3znLgH1rrfRaX5VNKqXbAn4C7ra7FKkopB+ajj9uVUseUUhlKqceUUrbavI8E1MVFAqXnHSsFwi2oxVJa62NW1+AvlFIxwEJgA2YXcENUDkQAfYG7lVL3WFyPz3h/ML8LPKK1bsibzDXG/IX1LcznkdMxe1kerM2byCCJiysBws47Fg4UW1CL8ANKqQ6YoZQGzNRaeywuyRLeP3clsEkp9QowBXjd2qp85g+A1lrPt7oQK3nDeVi1Q9uUUi8CNwD/rK37SAvq4tIAdd6xVO9x0cAopYZitpo+BaZrrcstLsnnlFLDlFKbzzscAuRbUY9FbgamK6XylVL5mF3+/1RK1doP5UCglOqslHrivMPBmK3rWiMtqItbAdiUUr8CXsL8zaAbsMDSqoTPKaWSgEXA41rrF62ux0LbgBZKqV8DLwD9gXuA6y2tyoe01qnVXyultgHPN8Bh5vnAb5RSmZit557Aw8DPavMm0oK6CK11JTAOM5hygceBqVrrU5YWJqzwEBCFObS8uNrH/7O6MF/SWhcA44FpmP9PvALcq7VeZWlhwue01lnAZOB+oBBzGsZftNaf1OZ9ZEddIYQQfklaUEIIIfySBJQQQgi/JAElhBDCL0lACSGE8EsSUEIIIfySBJQQQgi/JBN1haglSqk3gTsvcckTmKugrwCitNY+WTbLu37cd8AdWuu9l7jODqwHbtdaa1/UJsSlSAtKiNrzC6CZ92O491i/aseeAdZ6vy7xYV0PA9svFU5wdo29P2PucySE5WSirhB1QCnVBXOvoHZa60MW1hEKHAFGaq131fA9+4F7tNYr67I2IX6MdPEJ4UNKqeFU6+JTShmYO/T+HnNx4k3AbcCjwO2Yy8j8Xmv9jvf9UcCzmNsbGMA3wC8usSXKzUB+9XBSSv0BuA9zy4R04L+01kurvWcBZmtwZS38kYW4YtLFJ4T1ngZ+CVwDtAa2YAZTX2A+8C+lVKT32lcwg2ws5nYHBvCFUupiv2xOAJadeaGUut57r9swV+dfDHyslIqu9p5lwOhLfE8hfEICSgjr/UNrvUJrvQ1z1fRizFaNBp7D3JesnVKqPWaL6Fat9UZvq+h2zC3pr7vI9+4D7K72ui3mbriHvV2Pf8Zc/NVV7Zo0zA07z1m5Wwhfk9+QhLBeRrWvS4FDWuszD4fP7K8TArTxfq2VOmersnDMVtWiC3zvJsDpaq/fxRxpeMC7t9NC4A2tdVm1a3K8nxMv888hRK2SFpQQ1nOd9/piO/U6vdf2BHpU++gAvHGR93gA25kX3u1iemO2uNYCs4Ad3kEdZ5z5ueCu8Z9AiDogASVE4EgHgoAIrXWG1joDyAZmY4bUhRzHHAwBgFJqGnC/1nq51voXmC2vIsx9ns5oXO29QlhGuviECBBaa62UWgi8rZR6CDgFPIk5uGLPRd62Gehe7bUDmK2UOoE5YvAaoKn36zO6A3mc2/UohM9JC0qIwHInZph8CmwEYoAxWuv8i1y/GHO0HwBa64+BP2G2uvYC/wv8TGv9TbX3DAWWaa2li09YSibqClGPKaXCgUPAdVrrLTW43g4cxhwpuLqOyxPikqQFJUQ9prUuxWwtPVTDt0wBDkg4CX8gASVE/fc3oJs6b2z6+bytp8eBB3xSlRA/Qrr4hBBC+CVpQQkhhPBLElBCCCH8kgSUEEIIvyQBJYQQwi9JQAkhhPBL/x+sSb22N8p3hgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "xs = results.R.extract('x')\n",
    "ys = results.R.extract('y')\n",
    "\n",
    "xs.plot()\n",
    "ys.plot()\n",
    "\n",
    "decorate(xlabel='Time (s)',\n",
    "         ylabel='Position (m)')\n",
    "\n",
    "savefig('figs/chap22-fig01.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can plot the velocities the same way."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "vx = results.V.extract('x')\n",
    "vy = results.V.extract('y')\n",
    "\n",
    "vx.plot(label='vx')\n",
    "vy.plot(label='vy')\n",
    "\n",
    "decorate(xlabel='Time (s)',\n",
    "         ylabel='Velocity (m/s)')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The x velocity slows down due to drag.\n",
    "\n",
    "The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall.\n",
    "\n",
    "Another way to visualize the results is to plot y versus x.  The result is the trajectory of the ball through its plane of motion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure to file figs/chap22-fig02.pdf\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_trajectory(results):\n",
    "    xs = results.R.extract('x')\n",
    "    ys = results.R.extract('y')\n",
    "    plot(xs, ys, color='C2', label='trajectory')\n",
    "\n",
    "    decorate(xlabel='x position (m)',\n",
    "             ylabel='y position (m)')\n",
    "\n",
    "plot_trajectory(results)\n",
    "savefig('figs/chap22-fig02.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Animation\n",
    "\n",
    "One of the best ways to visualize the results of a physical model is animation.  If there are problems with the model, animation can make them apparent.\n",
    "\n",
    "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The draw function should take as parameters a `State` object and the time.  It should draw a single frame of the animation.\n",
    "\n",
    "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`.  Otherwise `matplotlib` auto-scales the axes, which is usually not what you want."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs = results.R.extract('x')\n",
    "ys = results.R.extract('y')\n",
    "\n",
    "def draw_func(state, t):\n",
    "    set_xlim(xs)\n",
    "    set_ylim(ys)\n",
    "    x, y = state.R\n",
    "    plot(x, y, 'bo')\n",
    "    decorate(xlabel='x position (m)',\n",
    "             ylabel='y position (m)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "animate(results, draw_func)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:** Delete the lines that set the x and y axes (or [comment them out](https://en.wiktionary.org/wiki/comment_out)) and see what the animation does."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Under the hood\n",
    "\n",
    "`Vector` is a function that returns a `ModSimVector` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "modsim.modsim.ModSimVector"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V = Vector(3, 4)\n",
    "type(V)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A `ModSimVector` is a specialized kind of Pint `Quantity`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "isinstance(V, Quantity)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There's one gotcha you might run into with Vectors and Quantities.  If you multiply a `ModSimVector` and a `Quantity`, you get a `ModSimVector`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}3.0 & 4.0\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}3.0 & 4.0\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([3., 4.]) <Unit('meter')>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V1 = V * m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "modsim.modsim.ModSimVector"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(V1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "But if you multiply a `Quantity` and a `Vector`, you get a `Quantity`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}3.0 & 4.0\\end{pmatrix} meter\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}3.0 & 4.0\\end{pmatrix}\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "array([3., 4.]) <Unit('meter')>"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V2 = m * V"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pint.quantity.build_quantity_class.<locals>.Quantity"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(V2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With a `ModSimVector` you can get the coordinates using dot notation, as well as `mag`, `mag2`, and `angle`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.0 <Unit('meter')>,\n",
       " 4.0 <Unit('meter')>,\n",
       " 5.0 <Unit('meter')>,\n",
       " 0.9272952180016122 <Unit('radian')>)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V1.x, V1.y, V1.mag, V1.angle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With a `Quantity`, you can't.  But you can use indexing to get the coordinates:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.0 <Unit('meter')>, 4.0 <Unit('meter')>)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V2[0], V2[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And you can use vector functions to get the magnitude and angle."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5.0 <Unit('meter')>, 0.9272952180016122 <Unit('radian')>)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vector_mag(V2), vector_angle(V2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And often you can avoid the whole issue by doing the multiplication with the `ModSimVector` on the left."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercises"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:** Run the simulation with and without air resistance.  How wrong would we be if we ignored drag?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>x</th>\n",
       "      <td>0 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>9.8 meter / second ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mass</th>\n",
       "      <td>0.145 kilogram</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>diameter</th>\n",
       "      <td>0.073 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rho</th>\n",
       "      <td>1.2 kilogram / meter ** 3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C_d</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>angle</th>\n",
       "      <td>45 degree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>velocity</th>\n",
       "      <td>40.0 meter / second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>10 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dt</th>\n",
       "      <td>0.1 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>init</th>\n",
       "      <td>R                                   [0 meter, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>area</th>\n",
       "      <td>0.004185386812745002 meter ** 2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "x                                                     0 meter\n",
       "y                                                     1 meter\n",
       "g                                     9.8 meter / second ** 2\n",
       "mass                                           0.145 kilogram\n",
       "diameter                                          0.073 meter\n",
       "rho                                 1.2 kilogram / meter ** 3\n",
       "C_d                                                         0\n",
       "angle                                               45 degree\n",
       "velocity                                  40.0 meter / second\n",
       "t_end                                               10 second\n",
       "dt                                                 0.1 second\n",
       "init        R                                   [0 meter, ...\n",
       "area                          0.004185386812745002 meter ** 2\n",
       "dtype: object"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Hint\n",
    "\n",
    "system_no_drag = System(system, C_d=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>success</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>message</th>\n",
       "      <td>A termination event occurred.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "success                             True\n",
       "message    A termination event occurred.\n",
       "dtype: object"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "results_no_drag, details = run_ode_solver(system_no_drag, slope_func, events=event_func)\n",
    "details"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "plot_trajectory(results)\n",
    "plot_trajectory(results_no_drag)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "99.30497406350605 meter"
      ],
      "text/latex": [
       "$99.30497406350605\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "99.30497406350605 <Unit('meter')>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "x_dist = get_last_value(results.R).x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "164.25596844639244 meter"
      ],
      "text/latex": [
       "$164.25596844639244\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "164.25596844639244 <Unit('meter')>"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "xdist_no_drag = get_last_value(results_no_drag.R).x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "64.95099438288639 meter"
      ],
      "text/latex": [
       "$64.95099438288639\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "64.95099438288639 <Unit('meter')>"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "xdist_no_drag - x_dist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$.  How much farther would a ball hit with the same velocity and launch angle travel?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>x</th>\n",
       "      <td>0 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>1 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>9.8 meter / second ** 2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mass</th>\n",
       "      <td>0.145 kilogram</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>diameter</th>\n",
       "      <td>0.073 meter</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rho</th>\n",
       "      <td>1.0 kilogram / meter ** 3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C_d</th>\n",
       "      <td>0.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>angle</th>\n",
       "      <td>45 degree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>velocity</th>\n",
       "      <td>40.0 meter / second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>t_end</th>\n",
       "      <td>10 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dt</th>\n",
       "      <td>0.1 second</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>init</th>\n",
       "      <td>R                                   [0 meter, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>area</th>\n",
       "      <td>0.004185386812745002 meter ** 2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "x                                                     0 meter\n",
       "y                                                     1 meter\n",
       "g                                     9.8 meter / second ** 2\n",
       "mass                                           0.145 kilogram\n",
       "diameter                                          0.073 meter\n",
       "rho                                 1.0 kilogram / meter ** 3\n",
       "C_d                                                      0.33\n",
       "angle                                               45 degree\n",
       "velocity                                  40.0 meter / second\n",
       "t_end                                               10 second\n",
       "dt                                                 0.1 second\n",
       "init        R                                   [0 meter, ...\n",
       "area                          0.004185386812745002 meter ** 2\n",
       "dtype: object"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Hint\n",
    "\n",
    "system2 = System(system, rho=1.0*kg/m**3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "105.77787365390012 meter"
      ],
      "text/latex": [
       "$105.77787365390012\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "105.77787365390012 <Unit('meter')>"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "results2, details2 = run_ode_solver(system2, slope_func, events=event_func)\n",
    "x = results2.R.extract('x')\n",
    "x_dist2 = get_last_value(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "6.472899590394064 meter"
      ],
      "text/latex": [
       "$6.472899590394064\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "6.472899590394064 <Unit('meter')>"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "x_dist2 - x_dist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does.  The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n",
    "\n",
    "<img src=\"data/baseball_drag.png\" width=\"400\">\n",
    "\n",
    "\n",
    "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file.  Here's how we can read it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Velocity in mph</th>\n",
       "      <th>Drag coefficient</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Velocity in meters per second</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0.026146</th>\n",
       "      <td>0.058486</td>\n",
       "      <td>0.49965</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8.871509</th>\n",
       "      <td>19.845000</td>\n",
       "      <td>0.49878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17.647351</th>\n",
       "      <td>39.476000</td>\n",
       "      <td>0.49704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22.432914</th>\n",
       "      <td>50.181000</td>\n",
       "      <td>0.48225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26.882303</th>\n",
       "      <td>60.134000</td>\n",
       "      <td>0.45004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30.636992</th>\n",
       "      <td>68.533000</td>\n",
       "      <td>0.40914</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32.977694</th>\n",
       "      <td>73.769000</td>\n",
       "      <td>0.38042</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34.604472</th>\n",
       "      <td>77.408000</td>\n",
       "      <td>0.36562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37.497268</th>\n",
       "      <td>83.879000</td>\n",
       "      <td>0.34822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40.460249</th>\n",
       "      <td>90.507000</td>\n",
       "      <td>0.33081</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43.492522</th>\n",
       "      <td>97.290000</td>\n",
       "      <td>0.31427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46.733562</th>\n",
       "      <td>104.540000</td>\n",
       "      <td>0.30035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50.886563</th>\n",
       "      <td>113.830000</td>\n",
       "      <td>0.28816</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54.047136</th>\n",
       "      <td>120.900000</td>\n",
       "      <td>0.28381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56.926074</th>\n",
       "      <td>127.340000</td>\n",
       "      <td>0.28033</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60.086646</th>\n",
       "      <td>134.410000</td>\n",
       "      <td>0.28207</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                               Velocity in mph  Drag coefficient\n",
       "Velocity in meters per second                                   \n",
       "0.026146                              0.058486           0.49965\n",
       "8.871509                             19.845000           0.49878\n",
       "17.647351                            39.476000           0.49704\n",
       "22.432914                            50.181000           0.48225\n",
       "26.882303                            60.134000           0.45004\n",
       "30.636992                            68.533000           0.40914\n",
       "32.977694                            73.769000           0.38042\n",
       "34.604472                            77.408000           0.36562\n",
       "37.497268                            83.879000           0.34822\n",
       "40.460249                            90.507000           0.33081\n",
       "43.492522                            97.290000           0.31427\n",
       "46.733562                           104.540000           0.30035\n",
       "50.886563                           113.830000           0.28816\n",
       "54.047136                           120.900000           0.28381\n",
       "56.926074                           127.340000           0.28033\n",
       "60.086646                           134.410000           0.28207"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "baseball_drag = pd.read_csv('data/baseball_drag.csv')\n",
    "mph = Quantity(baseball_drag['Velocity in mph'], UNITS.mph)\n",
    "mps = mph.to(m/s)\n",
    "baseball_drag.index = magnitude(mps)\n",
    "baseball_drag.index.name = 'Velocity in meters per second'\n",
    "baseball_drag"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results.  Hint: use `interpolate`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "drag_interp = interpolate(baseball_drag['Drag coefficient'])\n",
    "vs = linspace(0, 60)\n",
    "cds = drag_interp(vs)\n",
    "plot(vs, cds)\n",
    "decorate(xlabel='Velocity (m/s)', ylabel='C_d')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Solution\n",
    "\n",
    "def drag_force(V, system):\n",
    "    \"\"\"Computes drag force in the opposite direction of `v`.\n",
    "    \n",
    "    v: velocity\n",
    "    system: System object with rho, C_d, area\n",
    "    \n",
    "    returns: Vector drag force\n",
    "    \"\"\"\n",
    "    rho, C_d, area = system.rho, system.C_d, system.area\n",
    "    \n",
    "    C_d = drag_interp(V.mag)\n",
    "    mag = -rho * V.mag**2 * C_d * area / 2\n",
    "    direction = V.hat()\n",
    "    f_drag = direction * mag\n",
    "    return f_drag"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.31695653551010883"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C_d = drag_interp(43 * m / s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\\[\\begin{pmatrix}-1.023081126128183 & -1.023081126128183\\end{pmatrix} kilogram meter/second<sup>2</sup>\\]"
      ],
      "text/latex": [
       "$\\begin{pmatrix}-1.023081126128183 & -1.023081126128183\\end{pmatrix}\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$"
      ],
      "text/plain": [
       "array([-1.02308113, -1.02308113]) <Unit('kilogram * meter / second ** 2')>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "system = System(system, drag_interp=drag_interp)\n",
    "V = Vector(30, 30) * m/s\n",
    "f_drag = drag_force(V, system)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([28.28427125, 28.28427125]) <Unit('meter / second')>,\n",
       " array([ -6.53489118, -16.33489118]) <Unit('meter / second ** 2')>)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "slope_func(system.init, 0, system)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>success</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>message</th>\n",
       "      <td>A termination event occurred.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "success                             True\n",
       "message    A termination event occurred.\n",
       "dtype: object"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "results, details = run_ode_solver(system, slope_func, events=event_func)\n",
    "details"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>R</th>\n",
       "      <th>V</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4.600000</th>\n",
       "      <td>[86.37265447523836 meter, 6.352840864406531 me...</td>\n",
       "      <td>[12.388380175637913 meter / second, -18.940140...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4.700000</th>\n",
       "      <td>[87.59981910596807 meter, 4.4276738010043495 m...</td>\n",
       "      <td>[12.155784727055282 meter / second, -19.555228...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4.800000</th>\n",
       "      <td>[88.8038132288331 meter, 2.4417868717825417 me...</td>\n",
       "      <td>[11.925028455712733 meter / second, -20.154598...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4.900000</th>\n",
       "      <td>[89.98482652030708 meter, 0.396745649345958 me...</td>\n",
       "      <td>[11.696226535097686 meter / second, -20.738387...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4.918869</th>\n",
       "      <td>[90.20337227180956 meter, 0.0 meter]</td>\n",
       "      <td>[11.653444424369289 meter / second, -20.845633...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                          R  \\\n",
       "4.600000  [86.37265447523836 meter, 6.352840864406531 me...   \n",
       "4.700000  [87.59981910596807 meter, 4.4276738010043495 m...   \n",
       "4.800000  [88.8038132288331 meter, 2.4417868717825417 me...   \n",
       "4.900000  [89.98482652030708 meter, 0.396745649345958 me...   \n",
       "4.918869               [90.20337227180956 meter, 0.0 meter]   \n",
       "\n",
       "                                                          V  \n",
       "4.600000  [12.388380175637913 meter / second, -18.940140...  \n",
       "4.700000  [12.155784727055282 meter / second, -19.555228...  \n",
       "4.800000  [11.925028455712733 meter / second, -20.154598...  \n",
       "4.900000  [11.696226535097686 meter / second, -20.738387...  \n",
       "4.918869  [11.653444424369289 meter / second, -20.845633...  "
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "results.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "90.20337227180956 meter"
      ],
      "text/latex": [
       "$90.20337227180956\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "90.20337227180956 <Unit('meter')>"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "x = results.R.extract('x')\n",
    "x_dist3 = get_last_value(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "9.101601791696496 meter"
      ],
      "text/latex": [
       "$9.101601791696496\\ \\mathrm{meter}$"
      ],
      "text/plain": [
       "9.101601791696496 <Unit('meter')>"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "x_dist - x_dist3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(17.461046752327743 <Unit('meter / second')>, 40.0 <Unit('meter / second')>)"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "# Here are the highest and lowest speeds\n",
    "\n",
    "vs = results.V.extract('mag')\n",
    "interval = min(vs), max(vs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.49707694, 0.33351435])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Solution\n",
    "\n",
    "# And here are the drag coefficients at the highest and lowest speed.\n",
    "# They are substantially different.\n",
    "\n",
    "drag_interp(interval)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
